using System;
using System.Collections;
using System.Data;
using System.Data.SqlClient;
using Common;
using Microsoft.ApplicationBlocks.Data;
using DataAccess;
using SystemFrameworks;

namespace BusinessRules
{
	/// <summary>
	/// Clase de acceso a datos para la entidad MOD_VALORES_TIPOS_RESPUESTA
	/// </summary>
	public class ValorTipoRespuesta : SINIC
	{

        private string _CadenaConexion;
        public string CadenaConexion
        {
            get { return _CadenaConexion; }
            set { _CadenaConexion = value; }
        }

		#region Private Data Access Atributes

		private const String VAL_TIP_ID_PARAM = "@VAL_TIP_ID";
		private const String RES_ID_PARAM = "@RES_ID";
		private const String VAL_VALOR_RESPUESTA_PARAM = "@VAL_VALOR_RESPUESTA";
		private const String VAL_OTRO_PARAM = "@VAL_OTRO";

		#endregion Private Data Access Atributes

		/// <summary>
		/// Constructor de la clase MODValorTipoRespuesta
		/// </summary>
        public ValorTipoRespuesta(string strCadenaConecxion)
		{
            CadenaConexion = strCadenaConecxion;
		}

		public ValorTipoRespuestaData BuscarValorTipoRespuesta()
		{
			ValorTipoRespuestaData response = new ValorTipoRespuestaData();
			SqlHelper.ExecuteDataTable(CadenaConexion, CommandType.StoredProcedure, "PAS_BUSCAR_MOD_VALORES_TIPOS_RESPUESTA", response);
			if (response.Rows.Count == 0)
				return null;
			return response;
		}


		public ValorTipoRespuestaData ConsultarValorTipoRespuesta(decimal PAR_VAL_TIP_ID)
		{
			ValorTipoRespuestaData response = new ValorTipoRespuestaData();
			SqlParameter param1 = new SqlParameter(VAL_TIP_ID_PARAM, PAR_VAL_TIP_ID);
			SqlParameter[] parameters = {param1};
			SqlHelper.ExecuteDataTable(CadenaConexion, CommandType.StoredProcedure, "PAS_CONSULTAR_MOD_VALORES_TIPOS_RESPUESTA", response , parameters);
			if (response.Rows.Count == 0)
				return null;
			return response;
		}

		public ValorTipoRespuestaData ConsultarValorTipoRespuestaTipo(decimal RES_ID)
		{
			ValorTipoRespuestaData response = new ValorTipoRespuestaData();
			SqlParameter param1 = new SqlParameter(RES_ID_PARAM, RES_ID);
			SqlParameter[] parameters = {param1};
			SqlHelper.ExecuteDataTable(CadenaConexion, CommandType.StoredProcedure, "PAS_CONSULTAR_MOD_VALORES_TIPOS_RESPUESTA_TIPO", response , parameters);
//			if (response.Rows.Count == 0)
//				return null;
			return response;
		}

		public decimal AdicionarValorTipoRespuesta(ValorTipoRespuestaData datos)

		{
			DataTable tabla = datos ; //.Tables[ValorTipoRespuestaData.MOD_VALORES_TIPOS_RESPUESTA_TABLE];
			decimal decVAL_TIP_ID = 0;

			try
			{
				foreach (DataRow row in tabla.Rows)
				{
					SqlParameter param1 = new SqlParameter(VAL_TIP_ID_PARAM, SqlDbType.Decimal);
					param1.Direction = ParameterDirection.Output;
					SqlParameter param2 = new SqlParameter(RES_ID_PARAM, row[ValorTipoRespuestaData.RES_ID_FIELD]);
					SqlParameter param3 = new SqlParameter(VAL_VALOR_RESPUESTA_PARAM, row[ValorTipoRespuestaData.VAL_VALOR_RESPUESTA_FIELD]);
					SqlParameter[] parameters = {param1, param2, param3};
					SqlHelper.ExecuteNonQuery(CadenaConexion, CommandType.StoredProcedure, "PAS_ADICIONAR_MOD_VALORES_TIPOS_RESPUESTA", parameters);
					decVAL_TIP_ID = decimal.Parse(param1.Value.ToString());

				}

				return (decVAL_TIP_ID);

			}
			catch (SqlException sqlEx)
			{
				throw new ApplicationExceptionManager(Utilidad.DisplaySqlErrors(sqlEx, "MOD_VALORES_TIPOS_RESPUESTA"), sqlEx);
			}
			catch (Exception ex)
			{
				throw new ApplicationExceptionManager(Utilidad.TraerMensaje("gmsgErrorInsertar", "MOD_VALORES_TIPOS_RESPUESTA"), ex);
			}
		}

		public void ActualizarValorTipoRespuesta(ValorTipoRespuestaData datos)
		{
			DataTable tabla = datos ; //.Tables[ValorTipoRespuestaData.MOD_VALORES_TIPOS_RESPUESTA_TABLE];
			try
			{
				foreach (DataRow row in tabla.Rows)
				{
					SqlParameter param1 = new SqlParameter(VAL_TIP_ID_PARAM, row[ValorTipoRespuestaData.VAL_TIP_ID_FIELD]);
					SqlParameter param2 = new SqlParameter(RES_ID_PARAM, row[ValorTipoRespuestaData.RES_ID_FIELD]);
					SqlParameter param3 = new SqlParameter(VAL_VALOR_RESPUESTA_PARAM, row[ValorTipoRespuestaData.VAL_VALOR_RESPUESTA_FIELD]);

					SqlParameter[] parameters = {param1, param2, param3};
					SqlHelper.ExecuteNonQuery(CadenaConexion, CommandType.StoredProcedure, "PAS_ACTUALIZAR_MOD_VALORES_TIPOS_RESPUESTA", parameters);
				}
			}
			catch (SqlException sqlEx)
			{
				throw new ApplicationExceptionManager(Utilidad.DisplaySqlErrors(sqlEx, "MOD_VALORES_TIPOS_RESPUESTA"), sqlEx);
			}
			catch (Exception ex)
			{
				throw new ApplicationExceptionManager(Utilidad.TraerMensaje("gmsgErrorActualizar", "MOD_VALORES_TIPOS_RESPUESTA"), ex);
			}
		}

		public ValorTipoRespuestaData ConsultarEncuestasValoresTiposRespuestasTipo(string IdRes)
		{
			if (IdRes != string.Empty)
			{
				ValorTipoRespuestaData response = new ValorTipoRespuestaData();
				SqlParameter param1 = new SqlParameter(RES_ID_PARAM, IdRes);
				SqlParameter[] parameters = {param1};
				SqlHelper.ExecuteDataTable(CadenaConexion, CommandType.StoredProcedure, "PAS_CONSULTAR_MOD_VALORES_TIPOS_RESPUESTA_TIPO", response , parameters);
				if (response.Rows.Count == 0)
					return null;
				return response;
			}
			else
				return null;
		}
		
		public ValorTipoRespuestaData ConsultarEncuestasValoresTiposRespuestas(string IdRes, string ValRes)
		{
			ValorTipoRespuestaData response = new ValorTipoRespuestaData();
			SqlParameter param1 = new SqlParameter(RES_ID_PARAM, IdRes);
			SqlParameter param2 = new SqlParameter(VAL_VALOR_RESPUESTA_PARAM, ValRes);
			SqlParameter[] parameters = {param1, param2};
			SqlHelper.ExecuteDataTable(CadenaConexion, CommandType.StoredProcedure, "PAS_CONSULTAR_MOD_VALORES_TIPOS_RESPUESTA", response , parameters);
			if (response.Rows.Count == 0)
				return null;
			return response;
		}
		#region metodos nuevos
		public bool Adicionar(ValorTipoRespuestaData datos, params SqlTransaction[] transaction)
		{
			bool response = false;

			if (datos != null)
			{
				foreach (DataRow row in datos.Rows)
				{
					SqlParameter param1 = new SqlParameter(VAL_TIP_ID_PARAM, SqlDbType.Decimal);
					param1.Direction = ParameterDirection.Output;
					SqlParameter param2 = new SqlParameter(RES_ID_PARAM, row[ValorTipoRespuestaData.RES_ID_FIELD]);
					SqlParameter param3 = new SqlParameter(VAL_VALOR_RESPUESTA_PARAM, row[ValorTipoRespuestaData.VAL_VALOR_RESPUESTA_FIELD]);
					SqlParameter param4 = new SqlParameter(VAL_OTRO_PARAM, row[ValorTipoRespuestaData.VAL_OTRO_FIELD]);
					SqlParameter[] parameters = {param1, param2, param3, param4 };
					
					//decVAL_TIP_ID = decimal.Parse(param1.Value.ToString());

					try
					{
						if (transaction.Length > 0)
						{
							SqlHelper.ExecuteNonQuery(transaction[0], CommandType.StoredProcedure, "PAS_ADICIONAR_MOD_VALORES_TIPOS_RESPUESTA", parameters);
						}
						else
						{
							SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, "PAS_ADICIONAR_MOD_VALORES_TIPOS_RESPUESTA", parameters);
						}
						response = true;
					}
					catch (SqlException sqlEx)
					{
						throw new ApplicationExceptionManager(Utilidad.DisplaySqlErrors(sqlEx, "PAS_ADICIONAR_MOD_VALORES_TIPOS_RESPUESTA"), sqlEx);
					}
					catch (Exception ex)
					{
						throw new ApplicationExceptionManager(Utilidad.TraerMensaje("gmsgErrorInsertar", GetType().FullName), ex);
					}
				}
			}
			return response;
		}

		public bool Actualizar(ValorTipoRespuestaData datos, params SqlTransaction[] transaction)
		{
			bool response = false;
			if (datos != null)
			{
				foreach (DataRow row in datos.Rows)
				{
					SqlParameter param1 = new SqlParameter(VAL_TIP_ID_PARAM, row[ValorTipoRespuestaData.VAL_TIP_ID_FIELD]);
					SqlParameter param2 = new SqlParameter(RES_ID_PARAM, row[ValorTipoRespuestaData.RES_ID_FIELD]);
					SqlParameter param3 = new SqlParameter(VAL_VALOR_RESPUESTA_PARAM, row[ValorTipoRespuestaData.VAL_VALOR_RESPUESTA_FIELD]);

					SqlParameter[] parameters = {param1, param2, param3};
				//	SqlHelper.ExecuteNonQuery(CadenaConexion, CommandType.StoredProcedure, "PAS_ACTUALIZAR_MOD_VALORES_TIPOS_RESPUESTA", parameters);
				
					try
					{
						if (transaction.Length > 0)
						{
							SqlHelper.ExecuteNonQuery(transaction[0], CommandType.StoredProcedure, "PAS_ACTUALIZAR_MOD_VALORES_TIPOS_RESPUESTA", parameters);
						}
						else
						{
							SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, "PAS_ACTUALIZAR_MOD_VALORES_TIPOS_RESPUESTA", parameters);
						}
						response = true;
					}
					catch (SqlException sqlEx)
					{
						throw new ApplicationExceptionManager(Utilidad.DisplaySqlErrors(sqlEx, "PAS_ACTUALIZAR_MOD_VALORES_TIPOS_RESPUESTA"), sqlEx);
					}
					catch (Exception ex)
					{
						throw new ApplicationExceptionManager(Utilidad.TraerMensaje("gmsgErrorActualizar", GetType().FullName), ex);
					}
				}
			}
			return response;
		}

		public bool Eliminar(ValorTipoRespuestaData datos, params SqlTransaction[] transaction)
		{
			bool response = false;
			string strNombre = String.Empty;
			if (datos != null)
			{
				foreach (DataRow row in datos.Rows)
				{
					SqlParameter param1 = new SqlParameter(VAL_TIP_ID_PARAM, row[ValorTipoRespuestaData.VAL_TIP_ID_FIELD]);
					SqlParameter[] parameters = {param1};
					strNombre = row[ValorTipoRespuestaData.VAL_VALOR_RESPUESTA_FIELD].ToString();

					try
					{
						if (transaction.Length > 0)
						{
							SqlHelper.ExecuteNonQuery(transaction[0], CommandType.StoredProcedure, "PAS_ELIMINAR_MOD_VALORES_TIPOS_RESPUESTA", parameters);
						}
						else
						{
							SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, "PAS_ELIMINAR_MOD_VALORES_TIPOS_RESPUESTA", parameters);
						}
					}
					catch (SqlException sqlEx)
					{
						Mensaje += Utilidad.DisplaySqlErrors(sqlEx, GetType().Name, strNombre);
					}
					catch (Exception ex)
					{
						throw new ApplicationExceptionManager(Utilidad.TraerMensaje("gmsgErrorEliminar", GetType().FullName), ex);
					}
					response = true;
				}
			}
			return response;
		}

		public bool EjecutarCambios(ValorTipoRespuestaData datos, out string mensaje)
		{
			mensaje = String.Empty;
			bool response = false;
			bool responseAdd = false;
			bool responseDelete = false;
			bool responseUpdate = false;
			ValorTipoRespuestaData dataAdicionar = new ValorTipoRespuestaData();
			ValorTipoRespuestaData dataEliminar = new ValorTipoRespuestaData();
			ValorTipoRespuestaData dataActualizar = new ValorTipoRespuestaData();

			if (datos != null && datos.Rows.Count > 0)
			{
				foreach (DataRow row in datos.Rows)
				{
					switch (row.RowState)
					{
						case DataRowState.Added:
							dataAdicionar.ImportRow(row);
							break;
						case DataRowState.Modified:
							dataActualizar.ImportRow(row);
							break;
						case DataRowState.Deleted:
							DataRow dataRow = dataEliminar.NewRow();
							dataRow[ValorTipoRespuestaData.VAL_TIP_ID_FIELD] = row[ValorTipoRespuestaData.VAL_TIP_ID_FIELD, DataRowVersion.Original];
							dataRow[ValorTipoRespuestaData.RES_ID_FIELD] = row[ValorTipoRespuestaData.RES_ID_FIELD, DataRowVersion.Original];
							dataEliminar.addValoresTiposRespuesta(dataRow);
							break;
					}
				}
			}

			SqlConnection conexion = new SqlConnection(ConnectionString);
			conexion.Open();
			SqlTransaction transaccion = conexion.BeginTransaction();

			try
			{
				if (dataAdicionar != null && dataAdicionar.Rows.Count > 0)
				{
					responseAdd = Adicionar(dataAdicionar, transaccion);
				}
				if (dataActualizar != null && dataActualizar.Rows.Count > 0)
				{
					responseUpdate = Actualizar(dataActualizar, transaccion);
				}
				if (dataEliminar != null && dataEliminar.Rows.Count > 0)
				{
					responseDelete = Eliminar(dataEliminar, transaccion);
				}
				transaccion.Commit();
			}
			catch (Exception ex)
			{
				transaccion.Rollback();
				throw new ApplicationExceptionManager(Utilidad.TraerMensaje("gmsgCambiosNoExitoso", GetType().FullName), ex);
			}
			finally
			{
				if (conexion != null)
				{
					conexion.Close();
				}
				if (transaccion != null)
				{
					transaccion.Dispose();
				}
				if (conexion != null)
				{
					conexion.Dispose();
				}
			}
			if (responseAdd == true || responseDelete == true || responseUpdate == true)
			{
				response = true;
			}
			mensaje = Mensaje;
			return response;
		}

		public bool EjecutarCambios(ValorTipoRespuestaData datos , SqlTransaction transaccion, out string mensaje)
		{
			mensaje = String.Empty;
			bool response = false;
			bool responseAdd = false;
			bool responseDelete = false;
			bool responseUpdate = false;
			ValorTipoRespuestaData dataAdicionar = new ValorTipoRespuestaData();
			ValorTipoRespuestaData dataEliminar = new ValorTipoRespuestaData();
			ValorTipoRespuestaData dataActualizar = new ValorTipoRespuestaData();

			if (datos != null && datos.Rows.Count > 0)
			{
				foreach (DataRow row in datos.Rows)
				{
					switch (row.RowState)
					{
						case DataRowState.Added:
							dataAdicionar.ImportRow(row);
							break;
						case DataRowState.Modified:
							dataActualizar.ImportRow(row);
							break;
						case DataRowState.Deleted:
							DataRow dataRow = dataEliminar.NewRow();
							dataRow[ValorTipoRespuestaData.VAL_TIP_ID_FIELD] = row[ValorTipoRespuestaData.VAL_TIP_ID_FIELD, DataRowVersion.Original];
							dataRow[ValorTipoRespuestaData.RES_ID_FIELD] = row[ValorTipoRespuestaData.RES_ID_FIELD, DataRowVersion.Original];
							dataEliminar.addValoresTiposRespuesta(dataRow);
							break;
					}
				}
			}


			try
			{
				if (dataAdicionar != null && dataAdicionar.Rows.Count > 0)
				{
					responseAdd = Adicionar(dataAdicionar, transaccion);
				}
				if (dataActualizar != null && dataActualizar.Rows.Count > 0)
				{
					responseUpdate = Actualizar(dataActualizar, transaccion);
				}
				if (dataEliminar != null && dataEliminar.Rows.Count > 0)
				{
					responseDelete = Eliminar(dataEliminar, transaccion);
				}
				
			}
			catch (Exception ex)
			{				
				throw new ApplicationExceptionManager(Utilidad.TraerMensaje("gmsgCambiosNoExitoso", GetType().FullName), ex);
			}
			
			if (responseAdd == true || responseDelete == true || responseUpdate == true)
			{
				response = true;
			}
			mensaje = Mensaje;
			return response;
		}

		#endregion

	}
}